#include<bits/stdc++.h>
using namespace std;
long long t,n,m,l,mxv,cs[100009],sum1,sum2,cnt[100009];
bool vis[100009];
struct node
{
    long long d,v,a;
}p[100009];
long long chk(long long x)
{
    long long l=1,r=m;
    while(l<r-1)
    {
        long long mid=(l+r)>>1;
        if(x>=cs[mid])l=mid;
        else r=mid;
    }
    return r;
}
long long chk2(double x)
{
    long long l=1,r=m;
    while(l<r-1)
    {
        long long mid=(l+r)>>1;
        if(x>=cs[mid])l=mid;
        else r=mid;
    }
    return r;
}
struct jl
{
    long long opt,pos;
};
vector<jl>cf[100009];
map<int,bool>st[100009];
vector<int>e1[100009],e2[100009];
struct paixu
{
    long long xb,gs;
}nt[100009];
bool cmp(paixu A,paixu B)
{
    return A.gs<B.gs;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>t;
    while(t--)
    {
        sum1=0;sum2=0;
        cin>>n>>m>>l>>mxv;
        long long vv=mxv*mxv;
        for(int i=1;i<=n;i++)cin>>p[i].d>>p[i].v>>p[i].a;
        for(int i=1;i<=m;i++)cin>>cs[i];
        bool ok1=1,ok2=1,ok3=1;
        for(int i=1;i<=n;i++)
        {
            if(p[i].a==0)ok2=0,ok3=0;
            else if(p[i].a>0)ok1=0,ok3=0;
            else if(p[i].a<0)ok1=0,ok2=0;
        }
        if(ok1)
        {
            long long mx=0;
            for(int i=1;i<=m;i++)mx=max(mx,cs[i]);
            for(int i=1;i<=n;i++)
            {
                if(p[i].v>mxv&&p[i].d<=mx)sum1++;
            }
            cout<<sum1<<" "<<m-1<<"\n";
        }
        else if(ok2)
        {
            long long mx=0;
            for(int i=1;i<=m;i++)mx=max(mx,cs[i]);
            for(int i=1;i<=n;i++)
            {
                double d=1.0*(vv-p[i].v*p[i].v)/2/p[i].a;
                d+=p[i].d;
                if(d<mx)sum1++;
            }
            cout<<sum1<<" "<<m-1<<"\n";
        }
        else
        {
            for(int i=1;i<=n;i++)
            {
                if(p[i].a==0)
                {
                    if(p[i].v>mxv)
                    {
                        long long xh=chk(p[i].d);
                        if(cs[xh-1]==p[i].d)xh--;
                        cf[xh].push_back(jl{1,i});
                    }
                }
                else
                {
                    double d=1.0*(vv-p[i].v*p[i].v)/2/p[i].a;
                    d+=p[i].d;
                    long long xh=chk2(d);
                    if(p[i].a>0)
                    {
                        if(cs[xh]==d)xh++;
                        cf[xh].push_back(jl{1,i});
                    }
                    else
                    {
                        xh--;
                        if(cs[xh]==d)xh--;
                        long long qs=1;
                        qs=max(qs,p[i].d);
                        long long qs2=chk(qs);
                        if(qs==cs[qs2-1])qs2--;
                        if(qs2<=xh)
                        {
                            cf[qs2].push_back(jl{1,i});
                            cf[xh+1].push_back(jl{-1,i});
                        }
                    }
                }
            }
            for(int i=1;i<=m;i++)
            {
               st[i]=st[i-1];
               int siz=cf[i].size();
               for(int j=0;j<siz;j++)
               {
                   if(cf[i][j].opt==1)st[i][cf[i][j].pos]=1;
                   else st[i][cf[i][j].pos]=0;
               }
               for(int j=0;j<siz;j++)
               {
                   if(!vis[cf[i][j].pos])
                   {
                       sum1++;
                       vis[cf[i][j].pos]=1;
                   }

               }
            }
            cout<<sum1<<" ";
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if(st[j][i])
                    {
                        e1[i].push_back(j);
                    }
                }
                cnt[i]=e1[i].size();
            }
            for(int i=1;i<=m;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(st[i][j])
                    {
                        e2[i].push_back(j);
                    }
                }
                nt[i]={i,e2[i].size()};
            }
            sort(nt+1,nt+m+1,cmp);
            for(int i=1;i<=m;i++)
            {
                int siz=e2[nt[i].xb].size();
                bool ok=1;
                for(int j=0;j<siz;j++)
                {
                    if(cnt[e2[nt[i].xb][j]]<=1)ok=0;
                }
                if(ok)
                {
                    sum2++;
                    for(int j=0;j<siz;j++)
                    {
                        cnt[e2[nt[i].xb][j]]--;
                    }
                }
            }
            cout<<sum2<<"\n";
            for(int i=1;i<=m;i++)st[i].clear(),e2[i].clear(),cf[i].clear();
            for(int i=1;i<=n;i++)e1[i].clear();
            for(int i=1;i<=n;i++)vis[i]=0;
        }
    }
    return 0;
}
